#ifndef APPRENTICEOWNEDSTATE_H
#define APPRENTICEOWNEDSTATE_H

#include "State.h"
//This contains the states (in the form of classes) that can be assigned to the Apprentice.
// - Tyler Lawton

class Apprentice;

class VisitJungleAndHunt : public State<Apprentice> //BRANDON ROCKWELL 7/25
{
private:

  VisitJungleAndHunt(){}

  //copy ctor and assignment should be private
  VisitJungleAndHunt(const VisitJungleAndHunt&);
  VisitJungleAndHunt& operator=(const VisitJungleAndHunt&);
  
public:

  //this is a singleton
  static VisitJungleAndHunt* Instance();

  virtual void Enter(Apprentice* Apprentice);
  virtual void Execute(Apprentice* Apprentice);
  virtual void Exit(Apprentice* Apprentice);
};


//temp fix for dual state use
//added App to end of state name
class VisitOasisAndDrinkApp : public State<Apprentice>
{
private:
	VisitOasisAndDrinkApp(){}
	
	//copy ctor and assignment should be private
	VisitOasisAndDrinkApp(const VisitOasisAndDrinkApp&);
	VisitOasisAndDrinkApp& operator=(const VisitOasisAndDrinkApp&);

public:

  //this is a singleton
  static VisitOasisAndDrinkApp* Instance();

  virtual void Enter(Apprentice* Apprentice);
  virtual void Execute(Apprentice* Apprentice);
  virtual void Exit(Apprentice* Apprentice);
};


//created by Strog on 7/26
class VisitTreetopsAndPlay : public State<Apprentice>
{
private:
	VisitTreetopsAndPlay() {};
	
	//what are these actaully supposed to do?
	VisitTreetopsAndPlay(const VisitTreetopsAndPlay&);
	VisitTreetopsAndPlay& operator=(const VisitTreetopsAndPlay&);

public:	
	//this is a singleton, go figure
	static VisitTreetopsAndPlay* Instance();

	virtual void Enter(Apprentice* Apprentice);
	virtual void Execute(Apprentice* Apprentice);
	virtual void Exit(Apprentice* Apprentice);

};

//created by Strog on  7/28
//Yes, I know I wasn't assigned this class, but it's the default starting state of Apprentice
//so I needed to at least define it to get rid of some errors
class VisitTreetopsAndSleep : public State<Apprentice>
{
private:
	VisitTreetopsAndSleep() {};
	
	//what are these actaully supposed to do?
	VisitTreetopsAndSleep(const VisitTreetopsAndSleep&);
	VisitTreetopsAndSleep& operator=(const VisitTreetopsAndSleep&);

public:	
	//this is a singleton, go figure
	static VisitTreetopsAndSleep* Instance();

	virtual void Enter(Apprentice* Apprentice);
	virtual void Execute(Apprentice* Apprentice);
	virtual void Exit(Apprentice* Apprentice);

};

class VisitOasisAndBask : public State<Apprentice>
{
private:
	VisitOasisAndBask() {};
	
	//what are these actaully supposed to do?
	VisitOasisAndBask(const VisitOasisAndBask&);
	VisitOasisAndBask& operator=(const VisitOasisAndBask&);

public:	
	//this is a singleton, go figure
	static VisitOasisAndBask* Instance();

	virtual void Enter(Apprentice* Apprentice);
	virtual void Execute(Apprentice* Apprentice);
	virtual void Exit(Apprentice* Apprentice);

};

#endif